package cool.mylog.mylog2end.controller;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import cool.mylog.mylog2end.bean.Log;
import cool.mylog.mylog2end.mapper.LogMapper;
import cool.mylog.mylog2end.utils.JwtUtils;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

import static cool.mylog.mylog2end.utils.Encryptor.decrypt;
import static cool.mylog.mylog2end.utils.Encryptor.encrypt;

/**
 * log
 */
@RestController
@RequestMapping("log")
public class LogController {
    @Resource
    LogMapper logMapper;

    /**
     * get_public 获取单个public
     *
     * @param id Log的id
     * @return 单个Log对象
     */
    @GetMapping("get_public")
    public Log getPublic(Long id) {
        System.out.println("获取单个log" + id);
        return logMapper.getPublicById(id);
    }

    /**
     * get_publics 获取public列表
     * 传了userid，就通过userid中获取
     *
     * @param userid 用户id，可选
     * @param skip   开始
     * @param limit  限制
     * @return Log列表
     */
    @GetMapping("get_publics")
    public List<Log> getPublics(Long userid, Integer skip, Integer limit) {
        if (limit > 100) limit = 100;
        if (userid == null) return logMapper.getPublics(skip, limit);
        else return logMapper.getPublicsByUserid(userid, skip, limit);
    }

    /**
     * get_mylogs 获取mylog列表，mylog和public
     * 如果不传入 skip 和 limit，就是获取全部
     *
     * @param skip  从第几个开始，可选
     * @param limit 每页几个，可选
     * @param share 密文，解密后是logIds，只用传这个参数，不用传token
     * @return Log对象列表
     */
    @GetMapping("get_mylogs")
    public List<Log> getMylogs(String token, Integer skip, Integer limit, String share) {
        if (share != null) {
            JSONObject link = JSON.parseObject(decrypt(share));
            if (link != null) {
                Long userid = link.getLongValue("userid");
                List<Long> logIds = link.getList("logIds", Long.class);
                return logMapper.getMyLogsByIds(userid, logIds);
            }
        }

        Long id = JwtUtils.getId(token);
        if (id == 0) return null;

        if (skip != null && limit != null) // 获取全部
            return logMapper.getMylogsPageByUserId(id, skip, limit);

        return logMapper.getMylogsByUserid(id);
    }

    /**
     * get_share 获取分享链接
     * 先用用户id查属于他的log，再返回给logId列表加密的字符串
     *
     * @param token  用户令牌
     * @param logIdsJson log的id
     * @return 密文，用于getMylogs
     */
    @PostMapping("get_share")
    public String getShareLink(String token, String logIdsJson) {
        Long userid = JwtUtils.getId(token);
        if (userid == 0) return null;

        JSONArray logIdsArray = JSON.parseArray(logIdsJson);
        Long[] logIds = logIdsArray.toArray(Long.class);

        JSONObject link = new JSONObject();
        link.put("userid", userid);
        link.put("logIds", logIds);

        String linkJson = link.toJSONString();
        System.out.println(linkJson);

        return encrypt(linkJson);
    }

    /**
     * get_todos 获取todo列表
     *
     * @param token 用户令牌
     * @return Log对象列表
     */
    @GetMapping("get_todos")
    public List<Log> getTodos(String token) {
        Long id = JwtUtils.getId(token);
        if (id == 0) return null;

        return logMapper.getTodosByUserid(id);
    }

    /**
     * get_tags 获取Tags列表
     *
     * @param token 用户令牌
     * @return Log对象列表
     */
    @GetMapping("get_tags")
    public List<Log> getTags(String token) {
        Long id = JwtUtils.getId(token);
        if (id == 0) return null;

        return logMapper.getTagsByUserid(id);
    }

    /**
     * release_log 发布Log
     *
     * @param token   用户令牌
     * @param logJson log的JSON字符串
     * @return 新log id，失败返回0
     */
    @PostMapping("release_log")
    public Long releaseLog(String token, String logJson) {
        Long userid = JwtUtils.getId(token);
        if (userid == 0) return 0L;
        String username = JwtUtils.getName(token);

        // json字符串转为Log类型的对象，并重置log的userid和username
        Log log = JSON.parseObject(logJson, Log.class);
        log.setUserid(userid);
        log.setUsername(username);
        System.out.println("发布Log: " + log);
        // 如果标注了来源，说明是爬虫数据
        if (log.getInfo().getString("source") != null) logMapper.insertLogPc(log);
        else logMapper.insertLog(log);
        return log.getId();
    }

    /**
     * update_log 编辑Log
     *
     * @param token   用户令牌
     * @param logJson log的JSON字符串，log id 必传
     * @return 受影响的条数，失败返回0
     */
    @PostMapping("update_log")
    public Integer updateLog(String token, String logJson) {
        Long userid = JwtUtils.getId(token);
        if (userid == 0) return 0;
        Log log = Log.getLogByJson(logJson);
        log.setUserid(userid); // 重置一下从token获取的userid，前端就不用传了
        System.out.println(log);
        return logMapper.updateLog(log);
    }

    /**
     * delete_log 删除Log
     * 这里逻辑是，前端传入整个新log，后端根据id和userid删除，
     *
     * @param token 用户令牌
     * @param id    log的id
     * @return 删除log的条数，失败返回0
     */
    @PostMapping("delete_log")
    public Integer deleteLog(String token, Long id) {
        Long userid = JwtUtils.getId(token);
        if (userid == 0) return 0;
        return logMapper.deleteLog(id, userid);
    }

}
